#!/usr/bin/env bash
# Summary: Configure the shell environment for sbtenv

set -e
test -n "${SBTENV_DEBUG}" && set -x

print=""
no_rehash=""
for args in "${@}"
do
  if [ "${args}" = "-" ]; then
    print=1
    shift
  fi
  if [ "${args}" = "--no-rehash" ]; then
    no_rehash=1
    shift
  fi
done

shell="${1}"
if [ -z "${shell}" ]; then
  shell="$(ps c -p "${PPID}" -o 'ucomm=' 2> /dev/null || true)"
  shell="${shell##-}"
  shell="${shell%% *}"
  shell="$(basename "${shell:-${SHELL}}")"
fi

READLINK=$(type -p greadlink readlink | head -1)
if [ -z "${READLINK}" ]; then
  echo "sbtenv: cannot find readlink - are you missing GNU coreutils?" >& 2
  exit 1
fi

resolve_link() {
  ${READLINK} "${1}"
}

abs_dirname() {
  local cwd="$(pwd)"
  local path="${1}"

  while [ -n "${path}" ]; do
    cd "${path%/*}"
    local name="${path##*/}"
    path="$(resolve_link "${name}" || true)"
  done

  pwd
  cd "${cwd}"
}

root="$(abs_dirname "${0}")/.."

if [ -z "${print}" ]; then
  case "${shell}" in
    bash )
      profile='~/.bash_profile'
      ;;
    zsh )
      profile='~/.zshrc'
      ;;
    fish )
      profile='~/.config/fish/config.fish'
      ;;
    * )
      profile='your profile'
      ;;
  esac

  { echo "# Load sbtenv automatically by adding"
    echo "# the following to \"${profile}\":"
    echo ""
    case "${shell}" in
      fish )
        echo 'eval (sbtenv init - | source)'
        ;;
      * )
        echo 'eval "$(sbtenv init -)"'
        ;;
    esac
    echo ""
  } >& 2

  exit 1
fi

mkdir -p "${SBTENV_ROOT}/"{shims,versions}

if [[ ":${PATH}:" != *:"${SBTENV_ROOT}/shims":* ]]; then
  case "${shell}" in
    fish )
      echo "set -gx PATH '${SBTENV_ROOT}/shims' \$PATH"
      ;;
    * )
      echo 'export PATH="'${SBTENV_ROOT}'/shims:${PATH}"'
      ;;
  esac
fi

case "${shell}" in
  fish )
    echo "set -gx SBTENV_SHELL ${shell}"
    ;;
  * )
    echo "export SBTENV_SHELL=${shell}"
    ;;
esac

completion="${root}/completions/sbtenv.${shell}"
if [ -r "${completion}" ]; then
  case "${shell}" in
    * ) echo "source '${completion}'" ;;
  esac
fi

if [ -z "${no_rehash}" ]; then
  echo 'sbtenv rehash 2> /dev/null'
fi

commands=(`sbtenv-commands --sh`)
case "${shell}" in
fish )
  cat <<EOS
function sbtenv
  set command \$argv[1]
  set -e argv[1]

  switch "\$command"
  case ${commands[*]}
    source (sbtenv "sh-\$command" \$argv|psub)
  case '*'
    command sbtenv "\$command" \$argv
  end
end
EOS
  ;;
  * )
    cat <<EOS
 sbtenv() {
  local command
EOS
    ;;
esac

if [ "$shell" != "fish" ]; then
IFS="|"
cat <<EOS
  command="\$1"
  if [ "\$#" -gt 0 ]; then
    shift
  fi

  case "\$command" in
    ${commands[*]})
      eval "\`sbtenv "sh-\$command" "\$@"\`";;
    * )
      command sbtenv "\$command" "\$@";;
  esac
}
EOS
fi